AWS Lambda

Yeni bir konuya başlıyoruz. Serverless anlamında AWS'in FaaS (Function as a Service) çözmü olan Lambda servisine bakacağız. Adından da anlaşılacağı gibi server gereksinimi olmadan yazdığınız kodun çıktısını alabileceğiniz, aldığınız çıktı ile farklı bir servisi tetikleyebileceğiniz bir servis. Server gereksinimi olmadan kısmı tam doğru değil aslında server kısmını AWS hallediyor demek daha doğru olur.

Lambda olmadan ihtiyacımızı EC2 ile karşılıyorduk ve EC2'nun limitli yani seçtiğimiz ölçüde özellikleri oluyordu. EC2'nun sağlıklı çalışıp çalışmadığını biz takip ediyorduk. En büyük farkı da EC2 sürekli çalışıyordu. Her an istek gelme durumu olabileceği için bir makineyi sürekli ayakta tutmanız gerekiyordu. Lambda da ise RAM vey CPU belirtmemize gerek kalmadan ve sadece istek olduğunda kod çalıştıran ve sonuç döndüren bir servis. Ayrıca ücretlendirme de kod çalıştığı sürece oluyor. Lambda kısa süreli çalışan fonksiyonlar için çok uygun bir çözüm olmuş oluyor.

Lambda Limitler

Bir işlem için limitimiz 15 dakika yani fonksiyon maksimum bu süre kadar çalışabilir ama 15 dakika bir fonksiyonun sonuç döndürmesi için gayet uzun bir süre aslında.

İşlev başına 128Mb'dan 10Gb'a kadar Ram kullanabilirsiniz. Ram ile birlikte CPU ve network olarak da artırımlar otomatik gerçekleşir. Artırımlar birer MB olarak gerçekleşir.

Aynı anda 1000 işleme kadar yürütülebilir.

Kod ziplenmiş ise maksimum 50 MB, değilse Kod ve bağlılarıyla birlikte maksimum 250 MB olabilir.

Buradaki limitleri bilmek önemli çünkü sınavda verilen senaryolarda örnek olarak 30 GB RAM gerekli ise Lambda'ya gidemezsiniz.

Java, Go, PowerShell, Node.js, C #, Python, Ruby veya herhangi open source bir dilde yazılan fonksiyonları çalıştırabilirsiniz.

Yukarıdaki resimde Lambda ile entegre çalışan diğer servisleri görebilirsiniz. Örnek verecek olursak; S3 bucket içerisine bir obje koyulduğunda bir lambda function tetiklettirilip, o fonksiyonla objenin sıkıştırılmış halini farklı bir bucket'a aktarabiliriz aynı zamanda objenin metadatalarını DynamoDB'ye aktarabiliriz. Diğer bir örnek sistemde herhangi bir kullanıcı işlem yaptığında Cognito servisi sayesinde bir fonksiyon tetiklettirilip size mail atmasını sağlayabilirsiniz. Bir örnek daha vermek gerekirse CRON Job özelliği sayesinde CloudWatch Events rule veya EventBridge rule tetiklettirilerek zamansal işlemler(5 dakikada bir, hafta içi 08:17 arası gibi) lambda fonksiyonları ile yaptırılabilir.

Lamda Ücretlendirmesi

Aslında çok basit 2 kalemde hesaplanır. Birincisi istek sayısı, ikincisi fonksiyonun çalıştığı süre.

Yukarıdaki tablodan görüleceği üzere uygun fiyatlı bir servistir. Bu sebeple birçok firma AWS'in sadece lambda servisini kullanmaktadır. Free tier anlamında da oldukça cömert AWS lamda servisinde. Burada 12 ay kısıtlaması olmadan her zaman aylık 1 Milyon istek ve Aylık 3.2 Milyon saniye ücretsiz kullanım hakkı sunar.


Şimdi konsola geçelim uygulama yapalım. Arama kısmına lambda yazarak lambda servisini açalım. Create function ile ilk fonksiyonumuzu yapmaya başlayalım.

İlk bölümde fonksiyonu nasıl yapacağımı belirliyoruz. Author from scratch ile kendi hazırladığımız fonksiyonu kullanıyoruz. Use a buleprint ile AWS sık kullanılan işlemler için hazırladığı fonksiyonlardan birini seçebiliyoruz. Yaklaşık 50 adet hazır fonksiyon bulunmakta. Container Image ile de bir imajı çekip çalıştırabiliriz. Browse serverless app repository kısmını market place gibi düşünebilirsiniz. Burada daha önce kullanıcılar tarafından hazırlanmış hazır fonksiyonları görebilirsiniz. Çok sık kullanılanlar başta olacak şekilde sıralanmış yaklaşık 750 kadar fonksiyon bulunuyor. Biz kendi yazdığımız fonksiyonu kullanacağız ve ilk seçeneği seçelim.

Basic information kısmında fonsiyona bir isim verelim. Hemen altında kodumuz hangi dilde yazılmış ise ona uygun runtime seçelim. Runtime olarak python 3.8 seçtim. Diğer ayarlar default kalabilir. Create function diyelim.

Üst kısımda fonsiyonumuzu görüyoruz. Sol tarafında hangi işlem olduğunda bu fonksiyon tetiklensin kısmı add trigger var. Bu kısımda seçebileceğimiz bir çok AWS servisi ve desteklenen farklı uygulamaları görebiliriz. Örneğin S3 seçtiğimizde bize bucket ismi ve olay tipi seçmemizi isteyecek. Yani x bucket'ına bir obje eklendiği zaman buradaki fonksiyon çalışsın gibi. Aşağıdaki gibi bir menü karşılayacak.

Sağ tarafında fonksiyon çalıştıktan sonra neresi etkilenecek kısmı add destination var. Burada da fonksiyon başarılı veya başarısız olduğunda sonuçları görebilmek için aşağıdaki gibi farklı bir lambda'yı tetiklettirebilir, örneğin SNS ile mesaj alabiliriz.

Yukarıda python dilinde 0 ile 100 arasında random sayı üreten program yazdım. Gerçek hayatta burada kod yazıp çıktı almak için kullanmıyoruz. Genelde API Gateway'den gelen bir istek lambda'yı tetikleyecek ve sonucunda da farklı bir AWS servisi çalışıyor olacak. API Gateway konusundan sonra örneğine bakacağız.

Kısaca ne yapmamız gerekiyor ondan bahsedelim. Önce Code menüsüne kodumuzu yapıştırıyoruz.

import random
def lambda_handler(event, context):
    # TODO implement
    sayi = random.randint(0,100)
    return sayi

Yine aynı menüden Test'e tıklayarak test oluşturma işlemini yapıyoruz. Aşağıdaki gibi bir sayfa açılacak.

İsim verdikten sonra diğer bilgilere dokunmadan create diyeceğiz. Peki yukarıdaki key-valu lar nedir. Bunlar aslında parametre biz de parametre yok değişikliğe gerek yok ama siz kodunuzun içinde kullanıcıdan bir input alacak olsaydınız onu burada belirtmemiz gerekecekti. Test aşamasında inputu json formatında girmemiz gerekiyor bunu da hatırlatalım.

Şimdi Deploy'a basalım.Değişiklikler kaydolmuş oldu. Şimdi Test'e bastığımızda program çalışmış olacak.

Code menüsünde kodu yazıp deploy ettikten sonra test edebileceğimiz arayüz bulunmakta demiştik.

Test menüsünde de yukarıda anlattığım test oluşturma işlemini yapıyoruz.

Monitor menüsünde istatistikleri grafik olarak görebiliriz. Kaç saniye sürdü, Kaç kez hata aldı gibi değerleri grafik olarak görebiliriz.

Configuration mesünden bir çok konfigürasyon ayarını değiştirebiliriz. Memory, Time-out süresi, tirigger veya destination ekleme, izinler, vb. Burada time-out önemli 15 dakikayı geçemez çünkü lambda fonksiyonu maksimum 15 dakika sürebilir. Kod çalışma aşamasında verdiğimiz süre aşılırsa yani kod çalışması tamamlanamazsa hata vermiş olacak.


Şimdi ikinci bir örnek yapacağız. Önce amacımızı belirtelim. Bir S3 bucket'ına dosya yüklediğimizde lambda tetiklenecek ve o dosya belirttiğimiz diğer bucket'a gidecek. Burada 2 adet S3 bucket oluşturmamız gerekecek. Birisini kaynak diğerini hedef olarak isimlendirelim anlayacağımız şekilde tabi uniqe isimler olmalı. Daha sonra IAM servisine gidip Lambda için S3'e fullaccsess rolunü atayalım.

Lambda servisine gelip yeni bir fonksiyon create edelim.

import json
import boto3

# boto3 S3 initialization
s3_client = boto3.client("s3")


def lambda_handler(event, context):
   destination_bucket_name = 'samet-hedef-lambda'

   # event contains all information about uploaded object
   print("Event :", event)

   # Bucket Name where file was uploaded
   source_bucket_name = event['Records'][0]['s3']['bucket']['name']

   # Filename of object (with path)
   file_key_name = event['Records'][0]['s3']['object']['key']

   # Copy Source Object
   copy_source_object = {'Bucket': source_bucket_name, 'Key': file_key_name}

   # S3 copy object operation
   s3_client.copy_object(CopySource=copy_source_object, Bucket=destination_bucket_name, Key=file_key_name)

   return {
       'statusCode': 200,
       'body': json.dumps('Hello from S3 events Lambda!')
   }

Yukarıdaki kod da tek düzeltmeniz gereken yer destination_bucket_name = 'samet-hedef-lambda'. Kodu aldığım sitenin adresini de paylaşayım. https://www.powerupcloud.com/copying-objects-using-aws-lambda-based-on-s3-events-part-1/

Kodun testini yapıp deploy edelim.

Şimdi Add trigger diyelim. S3 servisini seçelim açılan menüde. Kaynak olarak belirlediğimiz bucket'ı seçelim. Event type olarak da all object create events seçebilirsiniz.

Denemesi bedava :) Kaynak olarak belirttiğimiz bucket'a dosya upload edelim hedef bucket'a gittiğini görelim.